/** <!--------------------------------------------------------------------------------------------->
 * @file GraphWindow.h
 *
 * GSvn - A Graphical Client for SVN
 * Copyright (C) 2012  Karl Krach, gsvn@bluespirit.la
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 <!---------------------------------------------------------------------------------------------> */

#ifndef GRAPHWINDOW_H
#define GRAPHWINDOW_H


// -- includes --
#include <QMainWindow>
#include <QGraphicsScene>

// --- forward declarations ---
namespace Ui {
	class GraphWindow;
}
class GraphBranch;

// --- namespaces ---
// --- defines ---


/** <!--------------------------------------------------------------------------------------------->
 * The graph window displays the revision graph.
 *
 * @author	Karl Krach, <gsvn@bluespirit.la>
 * @since	2012-01-06
 <!---------------------------------------------------------------------------------------------> */
class GraphWindow : public QMainWindow
{
	Q_OBJECT

	/* Con/-Destructors */
public:

	/** <!----------------------------------------------------------------------------------------->
	 * Creates the GraphWindow object
	 *
	 * @param pParent pointer to parent object
	 <!-----------------------------------------------------------------------------------------> */
	explicit GraphWindow(QWidget *parent = 0);

	/** <!----------------------------------------------------------------------------------------->
	 * Deletes the GraphWindow object
	 <!-----------------------------------------------------------------------------------------> */
	virtual ~GraphWindow();


	/* Implement SvnHistoryListener */
public:

	/** <!----------------------------------------------------------------------------------------->
	 * Callback method to be called on each history element
	 *
	 * @param iRevision  (in) SVN revision
	 * @param strMessage (in) SVN log message
	 * @param strAuthor  (in) SVN author
	 <!-----------------------------------------------------------------------------------------> */
	void OnHistoryReceive( int iRevision, QString strMessage, QString strAuthor );

	/** <!----------------------------------------------------------------------------------------->
	 * Callback method to be called on every progress-update
	 *
	 * @param fBytesReceived (in) Received bytes
	 * @param fThrougput     (in) Throughput in kB/sec
	 <!-----------------------------------------------------------------------------------------> */
	void OnHistoryProgress( float fBytesReceived, float fThrouput );

	/** <!----------------------------------------------------------------------------------------->
	 * Callback method to be called on every statistic update
	 *
	 * @param strCommand (in) Name of last command
	 * @param iMsNeeded  (in) Milliseconds need for the last command
	 <!-----------------------------------------------------------------------------------------> */
	void OnHistoryStatistics( QString strCommand, int iMsNeeded );


	/* Private Methods */
private:

	void AddRevision( GraphBranch* pBranch, GraphBranch* pEmptyBranch1, GraphBranch* pEmptyBranch2,
	                  QString strText );


	void AddBranch(  GraphBranch* pFrom, GraphBranch* pTo, GraphBranch* pEmptyBranch );

	/* Members */
private:

	/** <!----------------------------------------------------------------------------------------->
	 * Pointer to auto-generated UI-object
	 <!-----------------------------------------------------------------------------------------> */
	Ui::GraphWindow *ui;

	/** <!----------------------------------------------------------------------------------------->
	 * Graphical scene object
	 <!-----------------------------------------------------------------------------------------> */
	QGraphicsScene m_oScene;

};	// END class GraphWindow

#endif // GRAPHWINDOW_H
